/**
 * 该文件用于创建 仓库 Store
 */

import { createStore } from 'vuex'

// 引入定义好的常量
import { DECREMENT } from './mutation-types'

const checkoutApi = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() >= 0.5) {
        resolve() // 成功
      } else {
        reject() // 失败
      }
    }, 1000)
  })
}

// 创建 store
const store = createStore({
  /**
   * 存放 状态数据的东西
   */
  state() {
    return {
      count: 1,
      todos: [
        { id: 1, name: '吃饭', isDone: false },
        { id: 2, name: '睡觉', isDone: false },
        { id: 3, name: '打豆豆', isDone: true }
      ],

      // 购物车数据
      cart: [
        { id: 1, name: '吃饭', isDone: false },
        { id: 2, name: '睡觉', isDone: false },
        { id: 3, name: '打豆豆', isDone: true }
      ],

      status: ''
    }
  },

  getters: {
    dobuleCount(state) {
      return state.count * 2
    },
    doneTodos(state) {
      return state.todos.filter((todo) => todo.isDone)
    },
    todosLengthAndDobuleCount(state, getters) {
      // 依赖于 state.todos  、 getters.dobuleCount
      return state.todos.length + getters.dobuleCount
    },
    getTodoById(state) {
      // 返回函数
      return (id) => {
        return state.todos.find((todo) => todo.id === id)
      }
    }
  },

  mutations: {
    increment(state, payload) {
      console.log(payload)
      // 操作 state 做修改
      // setTimeout(() => {
      state.count++
      // }, 1000)
    },
    [DECREMENT](state) {
      state.count--
    },

    CHECKOUT_REQUEST(state) {
      // 直接清空购物车
      state.cart = []
    },

    CHECKOUT_SUCCESS(state) {
      // 成功, 将 state.status 设置为 success
      state.status = 'success'
    },

    CHECKOUT_FAILURE(state, payload) {
      // 失败，将 state.status 设置为 failure
      state.status = 'failure'

      // 回滚购物车数据
      state.cart = payload
    }
  },

  actions: {
    /**
     * action 会接受两个参数：
     *  1. context 上下文对象，可以简单的将其看成是当前store，它有如下的内容
     *    state
     *    getters
     *    commit
     *    dispatch
     *  2. payload 派发该动作时，传递过来的负载参数
     *    this.$store.dispatch(动作的名字, 传递给动作的负载参数)
     */
    asyncIncrement(context, payload) {
      console.log('asyncIncrement', payload)

      setTimeout(() => {
        // 修改 state 要通过提交一个 突变来操作
        context.commit('increment', 100)
      }, 2000)
    },

    checkout({ state, commit }) {
      // 0. 将当前的 cart 先做一个备份
      const oldCart = [...state.cart]

      // 1. 直接提交清空的突变
      commit('CHECKOUT_REQUEST')

      // 2. 调用接口
      checkoutApi()
        .then(() => {
          // 成功回调
          commit('CHECKOUT_SUCCESS')
        })
        .catch(() => {
          // 失败回调
          commit('CHECKOUT_FAILURE', oldCart)
        })
    }
  },

  modules: {}
})

console.log('===store', store)

// 默认导出 store
export default store
